10

Observer(观察者)

什么是Observer? Observer(观察者)是Observable(可观察对象)推送数据的消费者。在RxJS中,Observer是一个由回调函数组成的对象,键名分别为nexterrorcomplete,以此接受Observable推送的不同类型的通知,下面的代码段是Observer的一个示例:

var observer = {
  next: x => console.log('Observer got a next value: ' + x),
  error: err => console.error('Observer got an error: ' + err),
  complete: () => console.log('Observer got a complete notification'),
};

调用Observer逻辑,只需在subscribe(订阅)Observable后将Observer传入:

observable.subscribe(observer);

在RxJS中,Observer是可选的。在nexterrorcomplete处理逻辑部分缺失的情况下,Observable仍然能正常运行,为包含的特定通知类型的处理逻辑会被自动忽略。

下面例子中Observer并不包含complete类型通知的处理逻辑:

var observer = {
  next: x => console.log('Observer got a next value: ' + x),
  error: err => console.error('Observer got an error: ' + err),
};

在订阅Observable时,你甚至可以把回调函数作为参数传入,而不是传入完整的Observer对象:

observable.subscribe(x => console.log('Observer got a next value: ' + x));

在RxJS内部,调用observable.subscribe时,它会创建一个只有next处理逻辑的Observer。当然你也可以将nexterrorcomplete的回调函数分别传入:

observable.subscribe(
  x => console.log('Observer got a next value: ' + x),
  err => console.error('Observer got an error: ' + err),
  () => console.log('Observer got a complete notification')
);

Subscription

什么是Subscription? Subscription是一个代表可以终止资源的对象,表示一个Observable的执行过程。Subscription有一个重要的方法:unsubscribe。这个方法不需要传入参数,调用后便会终止相应的资源。在RxJS以前的版本中,Subscription被称为"Disposable"

var observable = Rx.Observable.interval(1000);
var subscription = observable.subscribe(x => console.log(x));

subscription.unsubscribe(); 

Subscription能够通过unsubscribe() 函数终止Observable的执行过程并释放相应资源。

Subscription可以嵌套使用:你可以调用一个Subscription的unsubscribe() 方法来取消一系列嵌套的Subscription。通过add方法,便可以实现Subscription的嵌套:

var observable1 = Rx.Observable.interval(400);
var observable2 = Rx.Observable.interval(300);

var subscription = observable1.subscribe(x => console.log('first: ' + x));
var childSubscription = observable2.subscribe(x => console.log('second: ' + x));

subscription.add(childSubscription);

setTimeout(() => {
  // 终止所有嵌套的Subscription
  subscription.unsubscribe();
}, 1000);

执行后,控制台会输出一下结果:


second: 0
first: 0
second: 1
first: 1
second: 2

此外,Subscription提供了remove(otherSubscription)方法,可以删除一个Subscription嵌套的子Subscription。


mumuzhenzhen
1.7k 声望557 粉丝